package com.itfenghuang.day14;

import java.util.concurrent.locks.ReentrantLock;

/*
多线程安全问题
 */
public class A02_线程同步 {
/*
    1.案例:买票问题
            某电影院正在上映大片,共100张票,有三个窗口,设计一个程序将这些票卖完
            分析:三个窗口同时卖票,三个线程   线程任务是相同的 卖票
                线程任务:卖票的时候  先判断是否还有票  如果有票就卖出去
                        如果没有就停止
                1).自定义类SellTicket  实现Runnable接口
                2).重写run()方法
                        先判断是否还有票  如果有票就卖出去
                3).创建三个窗口
    2.卖票问题
                1).出现问题   卖了重复的票
                2).出现问题的原因
                    线程在执行任务的时候丢失cpu的使用权
                3).线程安全问题的条件
                    多个线程
                    共享数据
                    有多个执行语句操作共享数据
     3.同步技术
                给操作共享数据代码加一把锁,保证在同一时刻只有一个线程操作共享数据
                a.同步代码块   b.同步方法  c.lock锁
                a.格式: synchronized(锁对象){操作共享数据的代码}
                b.格式: 修饰符 synchronized 返回值 方法名(方法参数){操作共享数据代码}
                    锁对象
                c.Lock锁
                    jdk5出现的
                    Lock接口
                        lock()获取锁
                        unlock()释放锁
                        使用ReentrantLock类对象加锁和解锁
           使用同步技术的好处与弊端
            好处:解决了多线程安全问题
            弊端:影响执行的效率

            死锁问题
                有两个或多个线程相互持有对方所需要的锁,又不肯释放自己手中的锁
 */
    public static void main(String[] args) {
//        SellTicket1 sl = new SellTicket1();
//        Thread t1 = new Thread(sl);
//        t1.setName("窗口1");
//        Thread t2 = new Thread(sl);
//        t2.setName("窗口2");
//        Thread t3 = new Thread(sl);
//        t3.setName("窗口3");
//        t1.start();
//        t2.start();
//        t3.start();

//        死循环问题(死锁问题)
//        Object o1 = new Object();
//        Object o2 = new Object();
//        new Thread(){
//                    @Override
//                    public void run() {
//                        while (true){
//                            synchronized (o1){
//                                synchronized (o2){
//                                    System.out.println("小左有一根左筷子");
//                                }
//                            }
//                        }
//                    }
//                }.start();new Thread(){
//                    @Override
//                    public void run() {
//                        while (true){
//                            synchronized (o2){
//                                synchronized (o1){
//                                    System.out.println("小艾有一根右筷子");
//                                }
//                            }
//                        }
//                    }
//                }.start();
    }
}
//class SellTicket implements Runnable{
//    private int total=100;
//
////    同步代码块
//    private Object o=new Object();
//    @Override
//    public void run() {
//        while (true){
//            synchronized (o){
//                if (total>0){
//                    System.out.println(Thread.currentThread().getName()
//                            +"卖了第"+total+"张票");
//                    total--;
//                }else {
//                    break;
//                }
//            }
//        }
//    }

//}

//class SellTicket1 implements Runnable{
//    private int total1=100;
//    @Override
//    public void run() {
//        while (true){
//         sellTicket();
//         if (total1==0){
//             break;
//        }
//    }
//}
//public synchronized void sellTicket() {
//    if (total1 > 0) {
//        System.out.println(Thread.currentThread().getName()
//                + "卖了第" + total1 + "张票");
//        total1--;
//        }
//    }
//}

